მე-6 შეხვედრა

შესავალი მონაცემთა ვიზუალიზაციაში

დავით სიჭინავა, CRRC-საქართველო | თსუ
3 მაისი, 2019 წ.

დღევანდელი გეგმა:

  • (მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში;
  • ვიზუალიზაციის ,,ფენოვანი" გრამატიკა;
  • ggplot2 ბიბლიოთეკა;
  • პრაქტიკული სამუშაოები;

სანამ დავიწყებდეთ:

  • დავრწმუნდეთ, რომ ყველა თქვენგანს ჩამოტვირთული აქვს ggplot2 და dplyr ბიბლიოთეკა
  • მიუთითეთ სამუშაო დირექტორია (კარგი პრაქტიკა)

სანამ დავიწყებდეთ:

library(ggplot2) #ვიზუალიზაცია
library(dplyr) #მონაცემთა მანიპულირება
library(gapminder) #სავარჯიშო მონაცემები Gapminder-იდან
library(scales) #ბიბლიოთეკა მასშტაბის სწორად მისათითებლად

რა არის მონაცემთა კარგი ვიზუალიზაცია?

Drawing წყარო: socviz.co

რა არის მონაცემთა _ცუდი_ ვიზუალიზაცია?: გემოვნებაზე დაობენ

Drawing წყარო: socviz.co

რა არის მონაცემთა _ცუდი_ ვიზუალიზაცია?: ცუდი მონაცემები

Drawing წყარო: socviz.co

რა არის მონაცემთა _ცუდი_ ვიზუალიზაცია?: ცუდი მონაცემები

Drawing წყარო: socviz.co

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში

  • აჩვენეთ მონაცემები,
  • ,,აიძულეთ“ მაყურებელი, იფიქროს მონაცემებზე,
  • ნუ დაამახინჯებთ იმას, თუ რას ამბობს მონაცემები,
  • წარმოადგინეთ ბევრი მონაცემი მცირე სივრცეში
  • იყავით თანმიმდევრული
  • წაახალისეთ მაყურებლის თვალი, ერთმანეთს სხვადასხვა კატეგორია შეადაროს
  • წარმოადგინეთ მონაცემთა დეტალების სხვადასხვა დონე
  • იფიქრეთ, თუ რა არის დიაგრამის მიზანი: აღწერა, აღმოჩენა, ტაბულაცია თუ - დეკორაცია
  • დიაგრამა ტექსტთან ინტეგრირებული უნდა იყოს

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში:

  • მონაცემების მიერ დიაგრამაზე დაკავებული ფართობი მათი რაოდენობრივი პროპორციების შესატყვისი უნდა იყოს
  • მოიშველიეთ წარწერები, რათა დიაგრამაზე არსებული გაურკვევლობები ახსნათ

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში:

  • აჩვენეთ მონაცემთა ვარიაცია და არა - დიზაინის ვარიაცია

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში:

Drawing

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში: ტაფტის ხუთი მცნება

  • აჩვენეთ მონაცემები,
  • გაზარდეთ მონაცემთა და ,,მელნის“ შეფარდება,
  • წაშალეთ ის ,,მელანი”, რომელიც მონაცემებიდან არ მომდინარეობს,
  • წაშალეთ უსარგებლო ,,მელანი", რომელიც მონაცემებიდან მომდინარეობს,
  • გაუკეთეთ რედაქტირება თქვენს ნამუშევარს

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში: გეშტალტის პრინციპები

Drawing წყარო: socviz.co

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში: გეშტალტის პრინციპები

ადამიანის თვალი მიდრეკილია, მონაცემებში გარკვეული კანონზომიერებები ,,დაინახოს'' იმის მიუხედავად, არსებობს თუ არა ეს კანონზომიერება Drawing წყარო: socviz.co

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში: გეშტალტის პრინციპები

  • სიახლოვე: ერთმანეთთან ახლოს მდებარე მონაცემები ერთმანეთთან დაკავშირებულად გვეჩვენება
  • მსგავსება: გარეგნულად შესადარი მონაცემები მსგავსად მიგვაჩნია
  • კავშირი: მონაცემები, რომლებიც ვიზუალურად ერთმანეთთან დაკავშირებულია, მსგავსი გვგონია
  • შევსება: ადამიანის თვალი ცდილობს, ნაწილობრივ დაფარული ფიგურები შეავსოს მისთვის ნაცნობი ფორმებით
  • ,,საერთო ბედი'' - ელემენტები, რომლებიც თანმიმდევრული ტრაექტორიით ხასიათდებიან, ერთი ელემენტის ნაწილად მოიაზრებიან

(მოკლე) შესავალი მონაცემთა ვიზუალიზაციაში: თუმცა, ტაფტიც ცდება...

Drawing წყარო: socviz.co

მონაცემთა ,,ფენოვანი" გრამატიკა

Drawing წყარო: menu.ge

მონაცემთა ,,ფენოვანი" გრამატიკა (Wilkinson, 2005; Wickham, 2008)

  • მონაცემები და ,,ესთეტიკა'';
  • ობიექტები (,,გეომები'');
  • სტატისტიკური ტრანსფორმაცია (,,სტატები'');
  • მასშტაბი;
  • წახნაგები (,,ფაცეტები'')

მონაცემთა ,,ფენოვანი" გრამატიკა (Wilkinson, 2005; Wickham, 2008)

Drawing წყარო: socviz.co

მონაცემთა ,,ფენოვანი" გრამატიკა: `ggplot2`

data(gapminder)

p <- ggplot(gapminder)

p

მონაცემთა ,,ფენოვანი" გრამატიკა: `ggplot2`

  • რა თქმა უნდა, როგორც ყველაფერი, ისე დიაგრამა ggplot2 გარემოში ობიექტს წარმოადგენს
  • ,,ესთეტიკის'' კარტირება ხდება aes() ფუნქციის მეშვეობით.
  • ,,ესთეტიკა'' აჩვენებს, თუ რა ცვლადები უნდა იქნას გამოყენებული დიაგრამაში

მონაცემთა ,,ფენოვანი" გრამატიკა: `ggplot2`

p <- ggplot(data = gapminder,
            mapping = aes(x = gdpPercap,
                          y = lifeExp))

p + geom_point()

მონაცემთა ,,ფენოვანი" გრამატიკა: `ggplot2`

  • მივუთითოთ, თუ რას ვყენებთ მონაცემებად,
  • მივუთითოთ, მონაცემთა შორის კავშირი,
  • მივუთითოთ, თუ რა ფორმით გვსურს ამ კავშირის გამოსახვა
  • ეს ყველაფერი ფენების სახით დავამატოთ დიაგრამას,
  • გამოვიყენოთ დამატებითი ფუნქციები მასშტაბის, წარწერების, ღერძების და ა.შ. მანიპულირებისთვის

მონაცემთა ,,ფენოვანი" გრამატიკა: `tidy` მონაცემები (Codd, 1990; Wickham, 2010)

  • თითოეული ცვლადი მოცემულია ცალკე სვეტში,
  • თითოეული ჩანაწერი მოცემულია ცალკე რიგში,
  • ჩანაწერის თითოეული ტიპი ქმნის ცხრილს,

Drawing წყარო: Wickham, 2010

მონაცემთა ,,ფენოვანი" გრამატიკა: `tidy` მონაცემები (Codd, 1990; Wickham, 2010)

Drawing წყარო: Wickham, 2010

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,ესთეტიკა''

  • position: პოზიცია,
  • color: ,,გარეთა ფერი",
  • fill: ,,შიდა ფერი",
  • shape: მარკერების ფორმა,
  • linetype: წრფის ტიპი,
  • size: ზომა

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,სტატები""

  • გამომდინარე იქიდან, რომ ჩვენ ქვეცნობიერად ვცდილობთ, მონაცემებში (არ)არსებული დამოკიდებულებები დავინახოთ, საჭიროა, რეალურად არსებული მოდელები ვაჩვენოთ
p <- ggplot(data = gapminder,
            mapping = aes(x = gdpPercap,
                          y=lifeExp))
p + geom_point()+
    geom_smooth()

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,სკალები""

p <- ggplot(data = gapminder,
            mapping = aes(x = gdpPercap,
                          y=lifeExp))
p + geom_point()+
    geom_smooth()+
    scale_x_log10()

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,ესთეტიკა""

ggplot(gapminder,
          aes(x = gdpPercap,
          y=lifeExp))+
      geom_point(aes(color=continent))+
      geom_smooth()+
      scale_x_log10()

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,ესთეტიკა""

ggplot(gapminder,
          aes(x = gdpPercap,
          y=lifeExp))+
      geom_point(aes(color=pop))+
      geom_smooth()+
      scale_x_log10()

ggsave("gapminder_plot.png", device="png", height=5)

მონაცემთა ,,ფენოვანი" გრამატიკა: ,,ჯგუფები და წახნაგები"

p <- ggplot(data = gapminder, mapping = aes(x = year, y = gdpPercap))
p + geom_line(color="gray70", aes(group = country)) +
    geom_smooth(size = 1.1, method = "loess", se = FALSE) +
    scale_y_log10(labels=scales::dollar) +
    facet_wrap(~ continent, ncol = 5) +
    labs(x = "Year",
         y = "GDP per capita",
         title = "GDP per capita on Five Continents")

მონაცემთა ,,ფენოვანი" გრამატიკა: Small multiples

  • თუკი მონაცემებში არსებობს ლოგიკური კატეგორიები, მნიშვნელოვანია მათი ჩვენება
  • ჩვენს შემთხვევაში, მონაცემთა კონტინენტების მიხედვით წარმოდგენა გაცილებით საინტერესო და მდიდარ ისტორიას გვიყვება
  • ,,წახნაგები'' სწორედ ამაში გვეხმარება

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

  • პროგრამაში შემოიტანეთ 2018 წლის დეკემბრის NDI-ის გამოკითხვის მონაცემები
  • ჩამოტვირთეთ და გაააქტიურეთ ბიბლიოთეკა haven

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

ndi <- haven::read_dta("NDI_2018_Jun_16.07.18_Public.dta")

table(ndi$PARTYSUPP1)
prop.table(table(ndi$PARTYSUPP1))

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

  • როგორც ვხედავთ, მოსახლეობის მხოლოდ მცირე ნაწილს აქვს პარტიული პრეფერენციები. უკეთესი ვიზუალიზაციისთვის საჭიროა, დავაჯგუფოთ მონაცემები
  • მონაცემთა მანიპულირებისთვის dplyr ბიბლიოთეკა გამოგვადგება
  • ფუნქციების თანმიმდევრობის უკეთ გამოსახატად ე.წ. პაიპ-ოპერატორები დაგვეხმარება

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

Drawing

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

party <- ndi %>% 
  mutate(party = case_when(
    PARTYSUPP1 == 8 ~ 1,
    PARTYSUPP1 == 6 ~ 2,
    PARTYSUPP1 == 7 ~ 3,
    PARTYSUPP1 == -1 ~ 5,
    PARTYSUPP1 == -2 ~ 6,
    PARTYSUPP1 == 25 ~ 7,
    TRUE ~ 4
  )) %>%
  count(., party, wt = WTIND) %>%
    mutate(n/sum(n))

names(party) <- c("party", "frequency", "proportion")
party$party <- factor(party$party, levels=c(1, 2, 3, 4, 5, 6, 7),
                                   labels=c("GD", "UNM", "MLEG", "Other",
                                   "DK", "RA", "None"))

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

ggplot(party, aes(party, proportion))+
  geom_bar(stat="identity")

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

  • მოდი, დავამატოთ სხვა ელემენტები:
    • სკალა შევზღუდოთ 100%-მდე,
    • გავუკეთოთ წარწერები
    • შევუცვალოთ ფონი
    • შევუცვალოთ ფერები (Color Brewer)
party.settype <- ndi %>% 
  mutate(party = case_when(
    PARTYSUPP1 == 8 ~ 1,
    PARTYSUPP1 == 6 ~ 2,
    PARTYSUPP1 == 7 ~ 3,
    PARTYSUPP1 == -1 ~ 5,
    PARTYSUPP1 == -2 ~ 6,
    PARTYSUPP1 == 25 ~ 7,
    PARTYSUPP1 < -2 ~ NA_real_,
    TRUE ~ 4
  )) %>%
  group_by(STRATUM)%>%
  count(., party, wt = WTIND) %>%
  mutate(n/sum(n))

names(party.settype) <- c("settlement",  "party", "frequency", "proportion")
party.settype$party <- factor(party.settype$party, levels=c(1, 2, 3, 4, 5, 6, 7),
                      labels=c("ოცნება", "ენმ", "ესმთ", "სხვა",
                               "არ ვიცი", "უარი", "სხვა"))
party.settype$settlement <- factor(party.settype$settlement, levels=c(1, 2, 3, 4, 5),
                      labels=c("თბილისი", "დიდი ქალაქი", "პატარა ქალაქი", "სოფელი", "ეთნ. უმცირესობები"))

მონაცემთა ვიზუალიზაციის სპეციალური შემთხვევა: გამოკითხვის მონაცემები

  • მოდი, დავამატოთ სხვა ელემენტები:
    • სკალა შევზღუდოთ 100%-მდე,
    • გავუკეთოთ წარწერები
    • შევუცვალოთ ფონი
    • შევუცვალოთ ფერები (Color Brewer)
ggplot(party.settype, aes(party, proportion))+
  geom_bar(aes(fill=party),stat="identity")+
  scale_fill_manual(values=c("#1f78b4", "#e31a1c", "#a6cee3", "#b2df8a", "#444444", "#999999", "#fb9a99"))+
  ylim(0, 1)+
  labs(title="რომელი პარტია დგას თქვენს შეხედულებებთან ყველაზე ახლოს?",
       subtitle="დასახლებული პუნქტის ტიპის მიხედვით")+
  theme_bw()+
  theme(legend.position = "none")+
  facet_grid(~settlement)

სასარგებლო რესურსები:

გამოყენებული რესურსები:

გმადლობთ!

Drawing david@sichinava.ge

Drawing davidsichinava

Drawing @davidsichinava